import {
	useStore
} from "../store"
import env from '@/config/env.js'

let requestQueue = 0 // 当前请求数量（用于管理 loading）
let pendingRequests = new Set() // 用于防重复请求

// 请求拦截器
function requestInterceptor(config) {
	const {
		userStore
	} = useStore()
	const token = userStore.token

	if (!config.header) config.header = {}
	config.header['Authorization'] = token ? `Bearer ${token}` : ''

	// 生成请求唯一 key（防止重复请求）
	const uniqueKey = `${config.method || 'GET'}:${config.url}:${JSON.stringify(config.data || {})}`
	if (config.noRepeat !== true) {
		if (pendingRequests.has(uniqueKey)) {
			return Promise.reject({
				message: '重复请求已拦截'
			})
		}
		pendingRequests.add(uniqueKey)
		config._uniqueKey = uniqueKey
	}

	// 显示全局 loading（可按需开启）
	if (config.loading !== false) {
		if (requestQueue === 0) {
			uni.showLoading({
				title: '加载中...',
				mask: true
			})
		}
		requestQueue++
	}

	return config
}

// ===== 响应拦截器 =====
function responseInterceptor(response, config) {
	// 请求完成后移除请求 key
	if (config._uniqueKey) {
		pendingRequests.delete(config._uniqueKey)
	}

	// 隐藏 loading
	if (config.loading !== false) {
		requestQueue--
		if (requestQueue <= 0) {
			requestQueue = 0
			uni.hideLoading()
		}
	}

	const { statusCode, data } = response
	if (statusCode === 200) {
		return data
	} else if (statusCode === 401) {
		uni.showToast({
			title: '登录已过期，请重新登录',
			icon: 'none'
		})

		// 重新跳转登录页
		uni.reLaunch({
			url: '/pages/login/login'
		})

		return Promise.reject(data)
	} else {
		uni.showToast({
			title: data.message || '请求失败',
			icon: 'none'
		})
		return Promise.reject(data)
	}
}

function request(options) {
	return new Promise((resolve, reject) => {
		try {
			const config = requestInterceptor({
				url: env.BASE_URL + options.url,
				method: options.method || 'GET',
				data: options.data || {},
				header: options.header || {},
				loading: options.loading, // 是否显示 loading（默认显示）
				noRepeat: options.noRepeat // 是否允许重复请求（默认 false）
			})

			uni.request({
				...config,
				success: (res) => {
					try {
						const result = responseInterceptor(res, config)
						resolve(result)
					} catch (err) {
						reject(err)
					}
				},
				fail: (err) => {
					// 网络错误时也需要移除 pending 状态 & 隐藏 loading
					if (config._uniqueKey) pendingRequests.delete(config._uniqueKey)
					if (config.loading !== false) {
						requestQueue--
						if (requestQueue <= 0) {
							requestQueue = 0
							uni.hideLoading()
						}
					}
					uni.showToast({
						title: '网络连接失败',
						icon: 'none'
					})
					reject(err)
				}
			})
		} catch (err) {
			reject(err)
		}
	})
}

const apiGet = request.get = (url, data = {}, config = {}) => {
	return request({
		url,
		data,
		method: 'GET',
		...config
	})
}

const apiPost = request.post = (url, data = {}, config = {}) => {
	return request({
		url,
		data,
		method: 'POST',
		...config
	})
}

export {
	apiGet,
	apiPost
}

export default request